[摘要] MFC中的窗口类,就是C++类与Windows窗口的句柄的结合,但是让太多的人对其不解和太多的迷惑。本文分析了MFC窗口类(C++类与窗口句柄的结合形成的类)的完整的生命过程。讲解了Attach和Detach的由来,让你清晰的认识到,窗口类如何形成,以及最后如何销毁的一个完整的过程。本文旨在让大家对窗口编程有个清晰完整的认识,MFC窗口类只是其中一个封装方式,如果我们要自己实现一套窗口机制,可以借鉴MFC的做法,或者我们可以轻松的使用MFC的窗口类。

Windows窗口句柄是用来确定Windows窗口的一个值,在win32编程中,都是很常见的。但是MFC为了简化编程就提供了CWnd窗口类将其包装了,然后对API函数封装后,就在创建对象时将窗口句柄关联到对象,然后提供的成员函数就可以省掉窗口句柄参数了。所以,在基于CWnd继承而来的所有类中,都有一个公有的成员变量m_hWnd,这个成员变量就是窗口对象关联的windows窗口句柄。我们在类中可以直接使用这个窗口句柄成员变量。这个窗口对象就是标准的C++对象。
     其实MFC窗口类并不神奇,就是包装了一下API而已。m_hWnd的类型就是HWND。因为窗口类都是一个C++对象,而C++对象就是我们平时使用C++时用的类实例化而来的。这么一说,其实窗口类和窗口对象其实就是将窗口句柄作为C++对象的一个成员,然后创建时关联的而已。在CreateWindow函数中,传入了窗口的ID,这样就让窗口类可以获得这个窗口ID的窗口句柄,进而保存到窗口对象成员m_hWnd中。这样就形成了关联。这样就创建了一个窗口对象。
     因为窗口对象是窗口类的实例,自然要遵守类的规则。所以,窗口对象的窗口句柄成员自然也是可以修改的。除去窗口句柄,就是一个单纯的C++对象。C++对象自然还可以和其他的窗口关联,进而操作其他的窗口。因为CWnd是基类,自然它的成员m_hWnd不可能是关联的,都是在创建时关联的,在销毁时解关联。这些机制就和对象的成员变量操作是一样的。但是因为m_hWnd的类型是HWND,并不是我们可以随意赋值的,必须赋值一个已存在的窗口的句柄。所以,就不要直接对这个m_hWnd进行赋值了。当然,如果你很清楚,也是可以的。为了更好的操作C++对象与窗口句柄的关联,MFC给CWnd提供了两个成员函数Attach(HWND hWndNew )和Detach()。前者传入一个窗口句柄,将该窗口关联到C++对象,后者则是将当前关联的窗口解关联。而关联就是给m_hWnd赋值,解关联就是将m_hWnd设置为NULL。关联就是这么个关系,看看这个过程,是不是并不复杂。每个成员函数都是有特别之处的。解关联后,窗口对象就不关联任何窗口了,此时就不能执行窗口相关的任何操作,都会失败。如果要关联新的窗口,只要执行Attach函数即可。
     由CreateWindow函数将窗口与C++对象关联,最后由DestroyWindow来将窗口与C++对象解关联,DestroyWindow内部就调用了Detach函数,这样就分离了。然后释放掉窗口资源,最后窗口对象即C++对象析构了。
     以上就是整个窗口对象的基本流程。